﻿//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Drawing;

//using LowLevelGraphics;

//namespace LowLevelGraphics.Extractors
//{
//    /// <summary>
//    /// 
//    /// </summary>
//    public class BlobExtractor : IEnumerable 
//    {
//        protected UnsafeBitmap m_Bitmap = null;
//        protected Blob[] m_aDetectedBlob = new Blob[]{};

//        protected Color m_ForegroundColor = Definitions.White;
//        /// <summary>
//        /// Initializes a new instance of the <see cref="BlobDetector"/> class.
//        /// </summary>
//        /// <param name="_bitmap">The _bitmap.</param>
//        public BlobExtractor(UnsafeBitmap _bitmap)
//        {
//            m_Bitmap = _bitmap;
//        }

//        /// <summary>
//        /// Detects this instance.
//        /// </summary>
//        /// <returns></returns>
//        public Blob[] Detect()
//        {
//            int nWidth = m_Bitmap.Width;
//            int nHeight = m_Bitmap.Height;
//            int[,] aLabel = new int[nWidth, nHeight];
//            int nNum = 0;
//            int nLabelCount = 1; // Initial Label number

//            int x = 0;
//            int y = 0;

//            Color color = Color.Transparent;
//            for (y = 1; y < nHeight - 1; y++)
//            {
//                for (x = 1; x < nWidth - 1; x++)
//                {
//                    color = m_Bitmap.GetPixel(x, y);

//                    //if (x - 1 < 0 || y - 1 < 0 || x + 1 > nWidth - 1) continue;
//                    if (color != m_ForegroundColor)
//                    {
//                        continue;
//                    }

//                    int a = aLabel[x - 1, y - 1];
//                    int b = aLabel[x, y - 1];
//                    int c = aLabel[x + 1, y - 1];
//                    int d = aLabel[x - 1, y];

//                    if (a == 0       //a
//                        && b == 0        //b
//                        && c == 0    //c
//                        && d == 0)       //d
//                    {
//                        aLabel[x, y] = nLabelCount;
//                        nLabelCount++;
//                    }
//                    else
//                    {
//                        nNum = 0;
//                        nNum = GetMinimum(new int[] { a, b, c, d });
//                        if (nNum > 0)
//                        {
//                            aLabel[x - 1, y - 1] = aLabel[x, y - 1] = aLabel[x + 1, y - 1] = aLabel[x - 1, y] = nNum;
//                        }
//                    }
//                }
//            }

//            m_aDetectedBlob = new Blob[nLabelCount];

//            Dictionary<int, Blob> aPoint = new Dictionary<int, Blob>();

//            for (y = 0; y < nHeight; y++)
//            {
//                for (x = 0; x < nWidth; x++)
//                {
//                    int nLabelKey = aLabel[x, y];
//                    if (!aPoint.ContainsKey(nLabelKey))
//                    {
//                        Blob newBlob = new Blob(nLabelKey);
//                        aPoint.Add(nLabelKey, newBlob);
//                    }
//                    else
//                    {
//                        aPoint[nLabelKey].m_aPoint.Add(new Point(x, y));
//                    }
//                }
//            }

//            int nIndex = 0;
//            foreach(KeyValuePair<int,Blob> keyValuePair in aPoint)
//            {
//                m_aDetectedBlob[nIndex++] = keyValuePair.Value;
//            }
//            return m_aDetectedBlob;
//        }

//        /// <summary>
//        /// Gets the minimum.
//        /// </summary>
//        /// <param name="aLabel">A label.</param>
//        /// <returns></returns>
//        public int GetMinimum(int[] aLabel)
//        {
//            Array.Sort(aLabel);
//            foreach (int i in aLabel)
//            {
//                if (i > 0) return i;
//            }
//            return -1;
//        }




//        #region IEnumerable Members

//        public IEnumerator GetEnumerator()
//        {
//            return m_aDetectedBlob.GetEnumerator();
//        }

//        #endregion
//    }
//}
